Go Concurrency Patterns: Pipelines and cancellation
首先,這篇主要以 pipeline 方式,將工作拆分成 N 個階段。
在第K個階段中使用 fan out pattern
產生多個 worker 運作
並且在接下來的階段中使用 fan in pattern
將資訊收集起來處理
但是在實際狀況,stage 不會每次都把所有資料接收完。
可能上個階段發生 error 提早結束,又或者下個階段不需要那麼多資料
問題1:如果 下游 stage
沒有成功消費完所有資料的話,會導致 上游 goroutine block, Resource Leak
解法:上游 outbound channel 使用 channel buffer。
問題2:上游 channel buffer 數量
取決於下游狀況,所以當上個階段多送,或下個階段少接,還是會造成 block
解法:使用 Explicit cancellation
(Done channel)
於是使用 Done Channel 告知個階段拋棄資料。(發送一次 Done 訊號
處理一個 潛在 Block
)
問題3:下游接收者得要知道上游的潛在 Block 數量
解法:將 Done Channel defer close,用 closed channel 拿出來的 zero value 處理 N 個 潛在 Block